package com.macaline.flux;

public class Test {

    public static void main(String[] args) {

//        Flux<Integer> range = Flux.range(1, 3);
//
//        StepVerifier.create(range)
//                .expectNext(1)
//                .expectNext(2)
//                .expectNext(3)
//                .verifyComplete();
//
//
//        Flux<Long> take = Flux.interval(Duration.ofSeconds(1))
//                .take(5);
//
//        StepVerifier.create(take)
//                .expectNext(0l)
//                .expectNext(1l)
//                .expectNext(2l)
//                .expectNext(3l)
//                .expectNext(4l)
//                .verifyComplete();


        // init
//        Flux<String> just = Flux.just("1", "2", "3", "4");
//        just.subscribe(item -> {
//            System.out.println("hello " + item);
//        });


//        Flux<String> just = Flux.just("1", "2", "3", "4");
//
//        Mono<Boolean> all = just.any(p -> p.contains("1"));
//
//        StepVerifier.create(all)
//                .expectNext(true)
//                .verifyComplete();




//        Flux<String> just1 = Flux.just("a", "b", "c", "d");
//
//        Mono<Map<String, String>> mapMono = just.collectMap(p -> p);
//
//        StepVerifier.create(mapMono)
//                .expectNextMatches(
//                        p-> p.size() == 4
//                )
//                .verifyComplete();

//
//        Flux<List<String>> buffer = just.buffer(2);
//
//        buffer.flatMap(x ->
//            Flux.fromIterable(x)
//                    .subscribeOn(Schedulers.parallel())
//                    .log()
//        ).subscribe();
//
//        StepVerifier.create(buffer)
//                .expectNext(Arrays.asList("1", "2"))
//                .expectNext(Arrays.asList("3", "4"))
//                .verifyComplete();
//
//        Flux<String> map = just.map(
//                p -> {
//                    return "add" + p;
//                }
//        );
//
//        StepVerifier.create(map)
//                .expectNext("add1")
//                .expectNext("add2")
//                .expectNext("add3")
//                .expectNext("add4")
//                .verifyComplete();
//
//
//        Flux<String> skip = just.skip(2)
//                .filter(p -> !p.contains("3"));
//
//
//        StepVerifier.create(skip)
//                .expectNext("4")
//                .verifyComplete();
//

//        Flux<String> zip = Flux.zip(just, just1, (a, b) -> a + "-" + b);
//
//        StepVerifier.create(zip)
//                .expectNext("1-a")
//                .expectNext("2-b")
//                .expectNext("3-c")
//                .expectNext("4-d")
//                .verifyComplete();
//
//        Flux<Tuple2<String, String>> tuple2Flux =
//                just.zipWith(just1);
//
//        StepVerifier.create(tuple2Flux)
//                .expectNextMatches(p -> {
//                    return p.getT1().equals("1") && p.getT2().equals("a");
//                })
//                .expectNextMatches(p -> {
//                    return p.getT1().equals("2") && p.getT2().equals("b");
//                })
//                .expectNextMatches(p -> {
//                    return p.getT1().equals("3") && p.getT2().equals("c");
//                })
//                .expectNextMatches(p -> {
//                    return p.getT1().equals("4") && p.getT2().equals("d");
//                })
//                .verifyComplete();


//
//        Flux<String> just = Flux.just("1", "2", "3", "4")
//                .delayElements(Duration.ofMillis(500));
//
//
//        Flux<String> just1 = Flux.just("a", "b", "c", "d")
//                .delaySubscription(Duration.ofMillis(250))
//                .delayElements(Duration.ofMillis(500));
//
//
//        Flux<String> stringFlux = just.mergeWith(just1);
//
//        StepVerifier.create(stringFlux)
//                .expectNext("1")
//                .expectNext("a")
//                .expectNext("2")
//                .expectNext("b")
//                .expectNext("3")
//                .expectNext("c")
//                .expectNext("4")
//                .expectNext("d")
//                .verifyComplete();

    }
}
